from django.contrib import auth
from django.core.exceptions import ImproperlyConfigured
from django.db import models
from django.db.models.manager import EmptyManager
from django.contrib.contenttypes.models import ContentType
from django.utils.encoding import smart_str
from django.utils.hashcompat import md5_constructor, sha_constructor
from django.utils.translation import ugettext_lazy as _
from saip.usuario.models import Usuario

"""
Modulo para la creacion de entidades o tablas para la administracion del proyecto.
:author: Marco Rolon, Bianca Benegas
"""

FASE_CHOICES = (
        ('A', u'An\xe1lisis de Requerimientos'),
        ('D', u'Dise\xf1o'),
        ('I', u'Implementaci\xf3n'),
        ('T', u'Terminado'),
)

ESTADO_CHOICES = (
        ('I', u'Iniciado'),
        ('D', u'En desarrollo'),
        ('A', u'Aprobado'),
        ('N', u'No aprobado'),
        ('T', u'Terminado'),
)
# Create your models here.
class UserManager(models.Manager):
    def create_user(self, username, email, password=None):
        "Crea y salva un usuario con el nombre de usuario, correo electronico y contrasenya."
        "Creates and saves a User with the given username, e-mail and password."
        now = datetime.datetime.now()
        user = self.model(None, username, '', '', email.strip().lower(), 'placeholder', False, True, False, now, now)
        if password:
            usuario.set_password(password)
        else:
            usuario.set_unusable_password()
        usuario.save()
        return usuario

class Proyecto(models.Model):
    """
    Clase para crear la tabla Proyecto con sus respectivos campos.
    Todos los campos son necesarios.
    """
    nombre = models.CharField(_('nombre'), max_length=30, unique=True)
    lider = models.ForeignKey(Usuario)
    descripcion = models.CharField(_('descripcion'), max_length=200)
    estado = models.CharField(_('estado'), max_length=1)
    fase_actual = models.CharField(_('fase_actual'), max_length=1, choices=FASE_CHOICES)
    fechaCreacion = models.DateTimeField('fechaCreacion')
    #objects = UserManager()

    class Meta:
        verbose_name = _('proyecto')
        verbose_name_plural = _('proyectos')

    def __unicode__(self):
        return self.nombre

    def get_absolute_url(self):
        return "/users/%s/" % urllib.quote(smart_str(self.nombre))

    def get_descripcion(self):
        "Returns the first_name plus the last_name, with a space in between."
        full_descripcion = u'%s %s' % (self.nombre, self.descripcion)
        return full_name.strip()

class LineaBase(models.Model):
    """
    Clase para crear la tabla LineaBase con sus respectivos campos.
    """
    proyecto = models.ForeignKey(Proyecto)
    #descripcion = models.CharField(_('descripcion'), max_length=200, unique=True)
    fase = models.CharField(_('fase'), max_length=1)

class TipoArtefacto(models.Model):
    """
    Clase para crear la tabla TipoArtefacto con sus respectivos campos.
    Los campos nombre y codigo son necesarios. Los demas son opcionales. 
    """
    proyec_tipoar = models.ForeignKey(Proyecto, null=True)
    nombre = models.CharField(_('nombre'), max_length=50)
    #icono = models.ImageField(upload_to='site_media/iconos', blank=True, null=True)
    #icono = models.CharField(_('icono'), max_length=200)
    fase = models.CharField(_('fase'), max_length=1, choices=FASE_CHOICES, null=True)
    codigo = models.CharField(_('codigo'), max_length=4)
    is_active = models.BooleanField(_('is_active'), default=True, help_text=_("Designates whether this user should be treated as active. Unselect this instead of deleting accounts."))
    class Meta:
        verbose_name = _('tipoart')
        verbose_name_plural = _('tiposart')

    def __unicode__(self):
        return u"%s" % (
            unicode(self.nombre))
    def cod(self):
        return u"%s" % (
            unicode(self.codigo))
    def get_nombre(self):
        return u"%s" % (
            unicode(self.nombre))

class Archivo(models.Model):
    nombre = models.CharField(max_length=50)
    contenido= models.TextField()
    tamano = models.IntegerField()
    class Meta:
        verbose_name = _('archivo')
        verbose_name_plural = _('archivos')
            
class Artefacto(models.Model):
    """
    Clase para crear la tabla Artefacto con sus respectivos campos.
    Los campos nombre, tipoArtefacto, descripcionBreve, descripcionDetallada
    y complejidad son necesarios. Los demas son opcionales.
    """
    nombre = models.CharField(_('nombre'), max_length=50)
    tipoArtefacto = models.ForeignKey(TipoArtefacto)
    proyecto = models.ForeignKey(Proyecto, null=True)
    lineaBase = models.ForeignKey(LineaBase, null=True)
    nro_Artefacto = models.IntegerField(_('Nro_Artefacto'), max_length=10, blank=True)
    version = models.IntegerField(_('version'), max_length=10, blank=True, null=True)
    estado = models.CharField(_('estado'), max_length=1)
    descripcionBreve = models.CharField(_('descripcionBreve'), max_length=200)
    descripcionDetallada = models.CharField(_('descripcionDetallada'), max_length=300)
    complejidad = models.IntegerField(_('complejidad'), max_length=1)
    #fase = models.IntegerField(_('fase'), max_length=10)
    fase = models.CharField(_('fase'), max_length=1, choices=FASE_CHOICES)
    #adjunto = models.FileField(upload_to='adjuntos', blank=True, null=True)
    adjunto = models.ForeignKey(Archivo, null=True)
    user_creado = models.ForeignKey(Usuario, null=True)
    fecha = models.DateTimeField('fecha', null=True)
    historico = models.CharField(_('historico'), max_length=1, null=True)
    #relacion= models.ManyToManyField('self', verbose_name=_('relacion'), through='relacion', blank=True, symmetrical=False)
    #relacion= models.ManyToManyField('self', through='Relacion', blank=True, symmetrical=False)
    
    class Meta:
        verbose_name = _('artefacto')
        verbose_name_plural = _('artefactos')

    def __unicode__(self):
        return u"%s" % (
            unicode(self.nombre))
    
    def existe(self):
        return True
            
class Relacion(models.Model):
    """
    Clase para crear la tabla Artefacto con sus respectivos campos.
    Todos los campos son necesarios.
    """
    padre = models.ForeignKey(Artefacto, related_name='padre')
    hijo = models.ForeignKey(Artefacto, related_name='hijo')
    between = models.BooleanField(_('between'), default=False)
    
